{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "\n",
    "import math\n",
    "\n",
    "from IPython import display\n",
    "from matplotlib import cm\n",
    "from matplotlib import gridspec\n",
    "from matplotlib import pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn import metrics\n",
    "import tensorflow as tf\n",
    "from tensorflow.python.data import Dataset\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.ERROR)\n",
    "pd.options.display.max_rows = 10\n",
    "pd.options.display.float_format = '{:.1f}'.format\n",
    "\n",
    "california_housing_dataframe = pd.read_csv(\"https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv\", sep=\",\")\n",
    "\n",
    "california_housing_dataframe = california_housing_dataframe.reindex(\n",
    "    np.random.permutation(california_housing_dataframe.index))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def preprocess_features(california_housing_dataframe):\n",
    "  \"\"\"Prepares input features from California housing data set.\n",
    "\n",
    "  Args:\n",
    "    california_housing_dataframe: A Pandas DataFrame expected to contain data\n",
    "      from the California housing data set.\n",
    "  Returns:\n",
    "    A DataFrame that contains the features to be used for the model, including\n",
    "    synthetic features.\n",
    "  \"\"\"\n",
    "  selected_features = california_housing_dataframe[\n",
    "    [\"latitude\",\n",
    "     \"longitude\",\n",
    "     \"housing_median_age\",\n",
    "     \"total_rooms\",\n",
    "     \"total_bedrooms\",\n",
    "     \"population\",\n",
    "     \"households\",\n",
    "     \"median_income\"]]\n",
    "  processed_features = selected_features.copy()\n",
    "  # Create a synthetic feature.\n",
    "  processed_features[\"rooms_per_person\"] = (\n",
    "    california_housing_dataframe[\"total_rooms\"] /\n",
    "    california_housing_dataframe[\"population\"])\n",
    "  return processed_features\n",
    "\n",
    "def preprocess_targets(california_housing_dataframe):\n",
    "  \"\"\"Prepares target features (i.e., labels) from California housing data set.\n",
    "\n",
    "  Args:\n",
    "    california_housing_dataframe: A Pandas DataFrame expected to contain data\n",
    "      from the California housing data set.\n",
    "  Returns:\n",
    "    A DataFrame that contains the target feature.\n",
    "  \"\"\"\n",
    "  output_targets = pd.DataFrame()\n",
    "  # Scale the target to be in units of thousands of dollars.\n",
    "  output_targets[\"median_house_value\"] = (\n",
    "    california_housing_dataframe[\"median_house_value\"] / 1000.0)\n",
    "  return output_targets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training examples summary:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>latitude</th>\n",
       "      <th>longitude</th>\n",
       "      <th>housing_median_age</th>\n",
       "      <th>total_rooms</th>\n",
       "      <th>total_bedrooms</th>\n",
       "      <th>population</th>\n",
       "      <th>households</th>\n",
       "      <th>median_income</th>\n",
       "      <th>rooms_per_person</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "      <td>12000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>35.6</td>\n",
       "      <td>-119.6</td>\n",
       "      <td>28.4</td>\n",
       "      <td>2648.5</td>\n",
       "      <td>540.5</td>\n",
       "      <td>1429.0</td>\n",
       "      <td>501.9</td>\n",
       "      <td>3.9</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>2.1</td>\n",
       "      <td>2.0</td>\n",
       "      <td>12.6</td>\n",
       "      <td>2187.8</td>\n",
       "      <td>421.6</td>\n",
       "      <td>1107.4</td>\n",
       "      <td>383.7</td>\n",
       "      <td>1.9</td>\n",
       "      <td>1.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>32.5</td>\n",
       "      <td>-124.3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>33.9</td>\n",
       "      <td>-121.8</td>\n",
       "      <td>18.0</td>\n",
       "      <td>1469.0</td>\n",
       "      <td>298.0</td>\n",
       "      <td>791.0</td>\n",
       "      <td>282.0</td>\n",
       "      <td>2.6</td>\n",
       "      <td>1.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>34.2</td>\n",
       "      <td>-118.5</td>\n",
       "      <td>28.0</td>\n",
       "      <td>2129.0</td>\n",
       "      <td>434.0</td>\n",
       "      <td>1167.0</td>\n",
       "      <td>410.0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>37.7</td>\n",
       "      <td>-118.0</td>\n",
       "      <td>37.0</td>\n",
       "      <td>3153.0</td>\n",
       "      <td>650.0</td>\n",
       "      <td>1723.0</td>\n",
       "      <td>606.0</td>\n",
       "      <td>4.8</td>\n",
       "      <td>2.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>42.0</td>\n",
       "      <td>-114.3</td>\n",
       "      <td>52.0</td>\n",
       "      <td>37937.0</td>\n",
       "      <td>5471.0</td>\n",
       "      <td>16122.0</td>\n",
       "      <td>5189.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>55.2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       latitude  longitude  housing_median_age  total_rooms  total_bedrooms  \\\n",
       "count   12000.0    12000.0             12000.0      12000.0         12000.0   \n",
       "mean       35.6     -119.6                28.4       2648.5           540.5   \n",
       "std         2.1        2.0                12.6       2187.8           421.6   \n",
       "min        32.5     -124.3                 1.0          2.0             2.0   \n",
       "25%        33.9     -121.8                18.0       1469.0           298.0   \n",
       "50%        34.2     -118.5                28.0       2129.0           434.0   \n",
       "75%        37.7     -118.0                37.0       3153.0           650.0   \n",
       "max        42.0     -114.3                52.0      37937.0          5471.0   \n",
       "\n",
       "       population  households  median_income  rooms_per_person  \n",
       "count     12000.0     12000.0        12000.0           12000.0  \n",
       "mean       1429.0       501.9            3.9               2.0  \n",
       "std        1107.4       383.7            1.9               1.2  \n",
       "min           3.0         2.0            0.5               0.0  \n",
       "25%         791.0       282.0            2.6               1.5  \n",
       "50%        1167.0       410.0            3.5               1.9  \n",
       "75%        1723.0       606.0            4.8               2.3  \n",
       "max       16122.0      5189.0           15.0              55.2  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Validation examples summary:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>latitude</th>\n",
       "      <th>longitude</th>\n",
       "      <th>housing_median_age</th>\n",
       "      <th>total_rooms</th>\n",
       "      <th>total_bedrooms</th>\n",
       "      <th>population</th>\n",
       "      <th>households</th>\n",
       "      <th>median_income</th>\n",
       "      <th>rooms_per_person</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>5000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>35.6</td>\n",
       "      <td>-119.6</td>\n",
       "      <td>28.9</td>\n",
       "      <td>2632.0</td>\n",
       "      <td>536.8</td>\n",
       "      <td>1430.8</td>\n",
       "      <td>499.5</td>\n",
       "      <td>3.9</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>2.1</td>\n",
       "      <td>2.0</td>\n",
       "      <td>12.4</td>\n",
       "      <td>2161.2</td>\n",
       "      <td>421.4</td>\n",
       "      <td>1239.8</td>\n",
       "      <td>386.5</td>\n",
       "      <td>1.9</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>32.6</td>\n",
       "      <td>-124.3</td>\n",
       "      <td>2.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>33.9</td>\n",
       "      <td>-121.8</td>\n",
       "      <td>19.0</td>\n",
       "      <td>1443.0</td>\n",
       "      <td>294.0</td>\n",
       "      <td>786.8</td>\n",
       "      <td>278.0</td>\n",
       "      <td>2.5</td>\n",
       "      <td>1.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>34.3</td>\n",
       "      <td>-118.5</td>\n",
       "      <td>29.0</td>\n",
       "      <td>2123.0</td>\n",
       "      <td>433.0</td>\n",
       "      <td>1165.0</td>\n",
       "      <td>408.0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>37.7</td>\n",
       "      <td>-118.0</td>\n",
       "      <td>37.0</td>\n",
       "      <td>3149.0</td>\n",
       "      <td>645.0</td>\n",
       "      <td>1716.0</td>\n",
       "      <td>603.2</td>\n",
       "      <td>4.8</td>\n",
       "      <td>2.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>42.0</td>\n",
       "      <td>-114.6</td>\n",
       "      <td>52.0</td>\n",
       "      <td>32627.0</td>\n",
       "      <td>6445.0</td>\n",
       "      <td>35682.0</td>\n",
       "      <td>6082.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>26.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       latitude  longitude  housing_median_age  total_rooms  total_bedrooms  \\\n",
       "count    5000.0     5000.0              5000.0       5000.0          5000.0   \n",
       "mean       35.6     -119.6                28.9       2632.0           536.8   \n",
       "std         2.1        2.0                12.4       2161.2           421.4   \n",
       "min        32.6     -124.3                 2.0          8.0             1.0   \n",
       "25%        33.9     -121.8                19.0       1443.0           294.0   \n",
       "50%        34.3     -118.5                29.0       2123.0           433.0   \n",
       "75%        37.7     -118.0                37.0       3149.0           645.0   \n",
       "max        42.0     -114.6                52.0      32627.0          6445.0   \n",
       "\n",
       "       population  households  median_income  rooms_per_person  \n",
       "count      5000.0      5000.0         5000.0            5000.0  \n",
       "mean       1430.8       499.5            3.9               2.0  \n",
       "std        1239.8       386.5            1.9               1.0  \n",
       "min           8.0         1.0            0.5               0.1  \n",
       "25%         786.8       278.0            2.5               1.5  \n",
       "50%        1165.0       408.0            3.5               1.9  \n",
       "75%        1716.0       603.2            4.8               2.3  \n",
       "max       35682.0      6082.0           15.0              26.5  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training targets summary:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>median_house_value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>12000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>207.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>116.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>15.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>119.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>180.8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>264.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>500.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       median_house_value\n",
       "count             12000.0\n",
       "mean                207.5\n",
       "std                 116.3\n",
       "min                  15.0\n",
       "25%                 119.3\n",
       "50%                 180.8\n",
       "75%                 264.1\n",
       "max                 500.0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Validation targets summary:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>median_house_value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>5000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>206.8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>115.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>15.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>120.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>179.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>267.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>500.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       median_house_value\n",
       "count              5000.0\n",
       "mean                206.8\n",
       "std                 115.3\n",
       "min                  15.0\n",
       "25%                 120.0\n",
       "50%                 179.2\n",
       "75%                 267.6\n",
       "max                 500.0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Choose the first 12000 (out of 17000) examples for training.\n",
    "training_examples = preprocess_features(california_housing_dataframe.head(12000))\n",
    "training_targets = preprocess_targets(california_housing_dataframe.head(12000))\n",
    "\n",
    "# Choose the last 5000 (out of 17000) examples for validation.\n",
    "validation_examples = preprocess_features(california_housing_dataframe.tail(5000))\n",
    "validation_targets = preprocess_targets(california_housing_dataframe.tail(5000))\n",
    "\n",
    "# Double-check that we've done the right thing.\n",
    "print(\"Training examples summary:\")\n",
    "display.display(training_examples.describe())\n",
    "print(\"Validation examples summary:\")\n",
    "display.display(validation_examples.describe())\n",
    "\n",
    "print(\"Training targets summary:\")\n",
    "display.display(training_targets.describe())\n",
    "print(\"Validation targets summary:\")\n",
    "display.display(validation_targets.describe())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def construct_feature_columns(input_features):\n",
    "  \"\"\"Construct the TensorFlow Feature Columns.\n",
    "\n",
    "  Args:\n",
    "    input_features: The names of the numerical input features to use.\n",
    "  Returns:\n",
    "    A set of feature columns\n",
    "  \"\"\" \n",
    "  return set([tf.feature_column.numeric_column(my_feature)\n",
    "              for my_feature in input_features])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def my_input_fn(features, targets, batch_size=1, shuffle=True, num_epochs=None):\n",
    "    \"\"\"Trains a linear regression model of one feature.\n",
    "  \n",
    "    Args:\n",
    "      features: pandas DataFrame of features\n",
    "      targets: pandas DataFrame of targets\n",
    "      batch_size: Size of batches to be passed to the model\n",
    "      shuffle: True or False. Whether to shuffle the data.\n",
    "      num_epochs: Number of epochs for which data should be repeated. None = repeat indefinitely\n",
    "    Returns:\n",
    "      Tuple of (features, labels) for next data batch\n",
    "    \"\"\"\n",
    "    \n",
    "    # Convert pandas data into a dict of np arrays.\n",
    "    features = {key:np.array(value) for key,value in dict(features).items()}                                           \n",
    " \n",
    "    # Construct a dataset, and configure batching/repeating\n",
    "    ds = Dataset.from_tensor_slices((features,targets)) # warning: 2GB limit\n",
    "    ds = ds.batch(batch_size).repeat(num_epochs)\n",
    "    \n",
    "    # Shuffle the data, if specified\n",
    "    if shuffle:\n",
    "      ds = ds.shuffle(10000)\n",
    "    \n",
    "    # Return the next batch of data\n",
    "    features, labels = ds.make_one_shot_iterator().get_next()\n",
    "    return features, labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_nn_regression_model(\n",
    "    my_optimizer,\n",
    "    steps,\n",
    "    batch_size,\n",
    "    hidden_units,\n",
    "    training_examples,\n",
    "    training_targets,\n",
    "    validation_examples,\n",
    "    validation_targets):\n",
    "  \"\"\"Trains a neural network regression model.\n",
    "  \n",
    "  In addition to training, this function also prints training progress information,\n",
    "  as well as a plot of the training and validation loss over time.\n",
    "  \n",
    "  Args:\n",
    "    my_optimizer: An instance of `tf.train.Optimizer`, the optimizer to use.\n",
    "    steps: A non-zero `int`, the total number of training steps. A training step\n",
    "      consists of a forward and backward pass using a single batch.\n",
    "    batch_size: A non-zero `int`, the batch size.\n",
    "    hidden_units: A `list` of int values, specifying the number of neurons in each layer.\n",
    "    training_examples: A `DataFrame` containing one or more columns from\n",
    "      `california_housing_dataframe` to use as input features for training.\n",
    "    training_targets: A `DataFrame` containing exactly one column from\n",
    "      `california_housing_dataframe` to use as target for training.\n",
    "    validation_examples: A `DataFrame` containing one or more columns from\n",
    "      `california_housing_dataframe` to use as input features for validation.\n",
    "    validation_targets: A `DataFrame` containing exactly one column from\n",
    "      `california_housing_dataframe` to use as target for validation.\n",
    "      \n",
    "  Returns:\n",
    "    A tuple `(estimator, training_losses, validation_losses)`:\n",
    "      estimator: the trained `DNNRegressor` object.\n",
    "      training_losses: a `list` containing the training loss values taken during training.\n",
    "      validation_losses: a `list` containing the validation loss values taken during training.\n",
    "  \"\"\"\n",
    "\n",
    "  periods = 10\n",
    "  steps_per_period = steps / periods\n",
    "  \n",
    "  # Create a linear regressor object.\n",
    "  my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)\n",
    "  dnn_regressor = tf.estimator.DNNRegressor(\n",
    "      feature_columns=construct_feature_columns(training_examples),\n",
    "      hidden_units=hidden_units,\n",
    "      optimizer=my_optimizer\n",
    "  )\n",
    "  \n",
    "  # Create input functions\n",
    "  training_input_fn = lambda: my_input_fn(training_examples, \n",
    "                                          training_targets[\"median_house_value\"], \n",
    "                                          batch_size=batch_size)\n",
    "  predict_training_input_fn = lambda: my_input_fn(training_examples, \n",
    "                                                  training_targets[\"median_house_value\"], \n",
    "                                                  num_epochs=1, \n",
    "                                                  shuffle=False)\n",
    "  predict_validation_input_fn = lambda: my_input_fn(validation_examples, \n",
    "                                                    validation_targets[\"median_house_value\"], \n",
    "                                                    num_epochs=1, \n",
    "                                                    shuffle=False)\n",
    "\n",
    "  # Train the model, but do so inside a loop so that we can periodically assess\n",
    "  # loss metrics.\n",
    "  print(\"Training model...\")\n",
    "  print(\"RMSE (on training data):\")\n",
    "  training_rmse = []\n",
    "  validation_rmse = []\n",
    "  for period in range (0, periods):\n",
    "    # Train the model, starting from the prior state.\n",
    "    dnn_regressor.train(\n",
    "        input_fn=training_input_fn,\n",
    "        steps=steps_per_period\n",
    "    )\n",
    "    # Take a break and compute predictions.\n",
    "    training_predictions = dnn_regressor.predict(input_fn=predict_training_input_fn)\n",
    "    training_predictions = np.array([item['predictions'][0] for item in training_predictions])\n",
    "    \n",
    "    validation_predictions = dnn_regressor.predict(input_fn=predict_validation_input_fn)\n",
    "    validation_predictions = np.array([item['predictions'][0] for item in validation_predictions])\n",
    "    \n",
    "    # Compute training and validation loss.\n",
    "    training_root_mean_squared_error = math.sqrt(\n",
    "        metrics.mean_squared_error(training_predictions, training_targets))\n",
    "    validation_root_mean_squared_error = math.sqrt(\n",
    "        metrics.mean_squared_error(validation_predictions, validation_targets))\n",
    "    # Occasionally print the current loss.\n",
    "    print(\"  period %02d : %0.2f\" % (period, training_root_mean_squared_error))\n",
    "    # Add the loss metrics from this period to our list.\n",
    "    training_rmse.append(training_root_mean_squared_error)\n",
    "    validation_rmse.append(validation_root_mean_squared_error)\n",
    "  print(\"Model training finished.\")\n",
    "\n",
    "  # Output a graph of loss metrics over periods.\n",
    "  plt.ylabel(\"RMSE\")\n",
    "  plt.xlabel(\"Periods\")\n",
    "  plt.title(\"Root Mean Squared Error vs. Periods\")\n",
    "  plt.tight_layout()\n",
    "  plt.plot(training_rmse, label=\"training\")\n",
    "  plt.plot(validation_rmse, label=\"validation\")\n",
    "  plt.legend()\n",
    "\n",
    "  print(\"Final RMSE (on training data):   %0.2f\" % training_root_mean_squared_error)\n",
    "  print(\"Final RMSE (on validation data): %0.2f\" % validation_root_mean_squared_error)\n",
    "\n",
    "  return dnn_regressor, training_rmse, validation_rmse"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最基础的SGD优化器："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model...\n",
      "RMSE (on training data):\n",
      "  period 00 : 144.71\n",
      "  period 01 : 130.64\n",
      "  period 02 : 113.92\n",
      "  period 03 : 106.64\n",
      "  period 04 : 105.67\n",
      "  period 05 : 103.20\n",
      "  period 06 : 103.30\n",
      "  period 07 : 101.25\n",
      "  period 08 : 103.38\n",
      "  period 09 : 102.30\n",
      "Model training finished.\n",
      "Final RMSE (on training data):   102.30\n",
      "Final RMSE (on validation data): 100.52\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_ = train_nn_regression_model(\n",
    "    my_optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.0007),\n",
    "    steps=5000,\n",
    "    batch_size=70,\n",
    "    hidden_units=[10, 10],\n",
    "    training_examples=training_examples,\n",
    "    training_targets=training_targets,\n",
    "    validation_examples=validation_examples,\n",
    "    validation_targets=validation_targets)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Assignment 1:使用线性缩放将特征标准化\n",
    "标准化到(-1,1)区间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def linear_scale(series):\n",
    "  min_val = series.min()\n",
    "  max_val = series.max()\n",
    "  scale = (max_val - min_val) / 2.0\n",
    "  return series.apply(lambda x:((x - min_val) / scale) - 1.0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model...\n",
      "RMSE (on training data):\n",
      "  period 00 : 231.24\n",
      "  period 01 : 208.24\n",
      "  period 02 : 161.48\n",
      "  period 03 : 117.65\n",
      "  period 04 : 113.64\n",
      "  period 05 : 109.63\n",
      "  period 06 : 104.80\n",
      "  period 07 : 99.28\n",
      "  period 08 : 92.87\n",
      "  period 09 : 86.57\n",
      "Model training finished.\n",
      "Final RMSE (on training data):   86.57\n",
      "Final RMSE (on validation data): 85.18\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def normalize_linear_scale(examples_dataframe):\n",
    "  \"\"\"Returns a version of the input `DataFrame` that has all its features normalized linearly.\"\"\"\n",
    "  #\n",
    "  # Your code here: normalize the inputs.\n",
    "  #\n",
    "  processed_features = pd.DataFrame()\n",
    "  processed_features[\"latitude\"] = linear_scale(examples_dataframe[\"latitude\"])\n",
    "  processed_features[\"longitude\"] = linear_scale(examples_dataframe[\"longitude\"])\n",
    "  processed_features[\"housing_median_age\"] = linear_scale(examples_dataframe[\"housing_median_age\"])\n",
    "  processed_features[\"total_rooms\"] = linear_scale(examples_dataframe[\"total_rooms\"])\n",
    "  processed_features[\"total_bedrooms\"] = linear_scale(examples_dataframe[\"total_bedrooms\"])\n",
    "  processed_features[\"population\"] = linear_scale(examples_dataframe[\"population\"])\n",
    "  processed_features[\"households\"] = linear_scale(examples_dataframe[\"households\"])\n",
    "  processed_features[\"median_income\"] = linear_scale(examples_dataframe[\"median_income\"])\n",
    "  processed_features[\"rooms_per_person\"] = linear_scale(examples_dataframe[\"rooms_per_person\"])\n",
    "  \n",
    "  return processed_features\n",
    "\n",
    "\n",
    "normalized_dataframe = normalize_linear_scale(preprocess_features(california_housing_dataframe))\n",
    "normalized_training_examples = normalized_dataframe.head(12000)\n",
    "normalized_validation_examples = normalized_dataframe.tail(5000)\n",
    "\n",
    "_ = train_nn_regression_model(\n",
    "    my_optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.0007),\n",
    "    steps=5000,\n",
    "    batch_size=70,\n",
    "    hidden_units=[10, 10],\n",
    "    training_examples=normalized_training_examples,\n",
    "    training_targets=training_targets,\n",
    "    validation_examples=normalized_validation_examples,\n",
    "    validation_targets=validation_targets)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Assignment 2: 尝试其他优化器\n",
    "出了最常用SGD优化方法外，常见的还有Momentum,Nesterov,AdaGrad,RMSProp,Adam等\n",
    "> AdaGrad 优化器是一种备选方案。AdaGrad 的核心是灵活地修改模型中每个系数的学习率，从而单调降低有效的学习率。该优化器对于凸优化问题非常有效，但不一定适合非凸优化问题的神经网络训练。您可以通过指定 AdagradOptimizer（而不是 GradientDescentOptimizer）来使用 AdaGrad。请注意，对于 AdaGrad，您可能需要使用较大的学习率。\n",
    "\n",
    "> 对于非凸优化问题，Adam 有时比 AdaGrad 更有效。要使用 Adam，请调用 tf.train.AdamOptimizer 方法。此方法将几个可选超参数作为参数，但我们的解决方案仅指定其中一个 (learning_rate)。在应用设置中，您应该谨慎指定和调整可选超参数。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 使用AdaGrad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model...\n",
      "RMSE (on training data):\n",
      "  period 00 : 80.05\n",
      "  period 01 : 76.91\n",
      "  period 02 : 73.91\n",
      "  period 03 : 71.22\n",
      "  period 04 : 72.25\n",
      "  period 05 : 70.71\n",
      "  period 06 : 70.86\n",
      "  period 07 : 70.59\n",
      "  period 08 : 70.10\n",
      "  period 09 : 70.00\n",
      "Model training finished.\n",
      "Final RMSE (on training data):   70.00\n",
      "Final RMSE (on validation data): 67.21\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_, adagrad_training_losses, adagrad_validation_losses = train_nn_regression_model(\n",
    "    my_optimizer=tf.train.AdagradOptimizer(learning_rate=0.5),\n",
    "    steps=500,\n",
    "    batch_size=100,\n",
    "    hidden_units=[10, 10],\n",
    "    training_examples=normalized_training_examples,\n",
    "    training_targets=training_targets,\n",
    "    validation_examples=normalized_validation_examples,\n",
    "    validation_targets=validation_targets)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 使用Adam"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model...\n",
      "RMSE (on training data):\n",
      "  period 00 : 209.89\n",
      "  period 01 : 121.61\n",
      "  period 02 : 114.06\n",
      "  period 03 : 103.62\n",
      "  period 04 : 87.59\n",
      "  period 05 : 75.75\n",
      "  period 06 : 72.63\n",
      "  period 07 : 71.75\n",
      "  period 08 : 71.15\n",
      "  period 09 : 70.75\n",
      "Model training finished.\n",
      "Final RMSE (on training data):   70.75\n",
      "Final RMSE (on validation data): 67.90\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_, adam_training_losses, adam_validation_losses = train_nn_regression_model(\n",
    "    my_optimizer=tf.train.AdamOptimizer(learning_rate=0.009),\n",
    "    steps=500,\n",
    "    batch_size=100,\n",
    "    hidden_units=[10, 10],\n",
    "    training_examples=normalized_training_examples,\n",
    "    training_targets=training_targets,\n",
    "    validation_examples=normalized_validation_examples,\n",
    "    validation_targets=validation_targets)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.ylabel(\"RMSE\")\n",
    "plt.xlabel(\"Periods\")\n",
    "plt.title(\"Root Mean Squared Error vs. Periods\")\n",
    "plt.plot(adagrad_training_losses, label='Adagrad training')\n",
    "plt.plot(adagrad_validation_losses, label='Adagrad validation')\n",
    "plt.plot(adam_training_losses, label='Adam training')\n",
    "plt.plot(adam_validation_losses, label='Adam validation')\n",
    "_ = plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Assignment 3: 尝试其他标准化方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1296x864 with 9 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 查看数据的分布，选取合适的缩放\n",
    "_ = training_examples.hist(bins=20, figsize=(18, 12), xlabelsize=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "#几种缩放函数\n",
    "def log_normalize(series):\n",
    "  return series.apply(lambda x:math.log(x+1.0))\n",
    "\n",
    "def clip(series, clip_to_min, clip_to_max):\n",
    "  return series.apply(lambda x:(\n",
    "    min(max(x, clip_to_min), clip_to_max)))\n",
    "\n",
    "def z_score_normalize(series):\n",
    "  mean = series.mean()\n",
    "  std_dv = series.std()\n",
    "  return series.apply(lambda x:(x - mean) / std_dv)\n",
    "\n",
    "def binary_threshold(series, threshold):\n",
    "  return series.apply(lambda x:(1 if x > threshold else 0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model...\n",
      "RMSE (on training data):\n",
      "  period 00 : 194.34\n",
      "  period 01 : 116.47\n",
      "  period 02 : 114.33\n",
      "  period 03 : 112.76\n",
      "  period 04 : 111.04\n",
      "  period 05 : 108.86\n",
      "  period 06 : 106.22\n",
      "  period 07 : 102.56\n",
      "  period 08 : 98.20\n",
      "  period 09 : 93.32\n",
      "Model training finished.\n",
      "Final RMSE (on training data):   93.32\n",
      "Final RMSE (on validation data): 91.69\n"
     ]
    },
    {
     "data": {
      "image/png": "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OW1Du/VEZMZrb28nKytLwTROzIysrKzzaokqnEREQME0zs73/Zyx4dTd08uTrx3jlcP1QZciIiJDzNhwCpnxdz9/jcc2Hw66FBERGhoa+M53vnPW673lLW+hoaFhxGW+9KUv8dvf/vZcSwvEzA2nkLFudhz7yg4FXYqIyBnDqadn5AvsPvnkk6Snp4+4zFe+8hVuuOGG86pvss3YcKKni/9z5N3ccmoDxxpPuziriMik+vznP8/BgwdZsmQJK1as4Nprr+W9730vl112GQDveMc7uPzyy1mwYAEPPPBA/3olJSXU1NRQXl7OpZdeyoc+9CEWLFjAm970JtravP9tt99+O48//nj/8vfccw/Lli3jsssuY9++fQBUV1dz4403smzZMj784Q9TXFxMTU3NJL8LA2buoeRRMXTmLGJV1V5ePlTHrUsKgq5IRCLAvb/azZ6qpnHd5vz8VO65ZcGIy3zta19j165dbN++neeee463vvWt7Nq1q/9Q7IceeojMzEza2tpYsWIFf/qnf0pWVtagbezfv5/HHnuMBx98kHe961389Kc/5f3vf/9pz5Wdnc0rr7zCd77zHe6//36+973vce+993Lddddx99138/TTTw8KwCDM3JYTkHDhOhbaIV49UBl0KSIig6xcuXLQOULf+ta3WLx4MatXr+bIkSPs37//tHVKS0tZsmQJAJdffjnl5eXDbvud73znacu8+OKLrF+/HoCbbrqJjIyMcXw1Z2/mtpyAUMla+MP9tB38I7Aq6HJEJAKM1sKZLElJSf33n3vuOX7729+yceNGEhMTueaaa4Y9hyguLq7/flRUVP9uvTMtFxUVRXd3N+CdOBtJZnTLiaKV9Fg0Rae2U9PcEXQ1IjKDpaSkcOrUqWHnNTY2kpGRQWJiIvv27WPTpk3j/vxr165lw4YNADzzzDPU1wd7ms3MDqfYJNqzF7Iq5PU7iYgEJSsrizVr1rBw4UI++9nPDpp300030d3dzaJFi/jiF7/I6tWrx/3577nnHp555hmWLVvGU089RV5eHikpKeP+PGNlkdaUOxvLly9353uxwZ7ffJGel/6Nry/9LX//jmXjVJmITCV79+7l0ksvDbqMQHV0dBAVFUV0dDQbN27krrvuYvv27ee1zeHeVzPb5pxbPtq6M7rPCSCqdC1RG79F0/6NgMJJRGamw4cP8653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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def normalize(examples_dataframe):\n",
    "  \"\"\"Returns a version of the input `DataFrame` that has all its features normalized.\"\"\"\n",
    "  #\n",
    "  # YOUR CODE HERE: Normalize the inputs.\n",
    "  #\n",
    "  processed_features = pd.DataFrame()\n",
    "  processed_features[\"households\"] = log_normalize(examples_dataframe[\"households\"])\n",
    "  processed_features[\"median_income\"] = log_normalize(examples_dataframe[\"median_income\"])\n",
    "  processed_features[\"total_bedrooms\"] = log_normalize(examples_dataframe[\"total_bedrooms\"])\n",
    "  processed_features[\"latitude\"] = linear_scale(examples_dataframe[\"latitude\"])\n",
    "  processed_features[\"longitude\"] = linear_scale(examples_dataframe[\"longitude\"])\n",
    "  processed_features[\"housing_median_age\"] = linear_scale(examples_dataframe[\"housing_median_age\"])\n",
    "  processed_features[\"population\"] = linear_scale(clip(examples_dataframe[\"population\"], 0, 5000))\n",
    "  processed_features[\"rooms_per_person\"] = linear_scale(clip(examples_dataframe[\"rooms_per_person\"], 0, 5))\n",
    "  processed_features[\"total_rooms\"] = linear_scale(clip(examples_dataframe[\"total_rooms\"], 0, 10000))\n",
    "\n",
    "  return processed_features\n",
    "\n",
    "normalized_dataframe = normalize(preprocess_features(california_housing_dataframe))\n",
    "normalized_training_examples = normalized_dataframe.head(12000)\n",
    "normalized_validation_examples = normalized_dataframe.tail(5000)\n",
    "\n",
    "_ = train_nn_regression_model(\n",
    "    my_optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.0007),\n",
    "    steps=5000,\n",
    "    batch_size=70,\n",
    "    hidden_units=[10, 10],\n",
    "    training_examples=normalized_training_examples,\n",
    "    training_targets=training_targets,\n",
    "    validation_examples=normalized_validation_examples,\n",
    "    validation_targets=validation_targets)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Assignment 4: 仅使用经度和纬度作为特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model...\n",
      "RMSE (on training data):\n",
      "  period 00 : 218.32\n",
      "  period 01 : 164.45\n",
      "  period 02 : 113.34\n",
      "  period 03 : 107.97\n",
      "  period 04 : 106.75\n",
      "  period 05 : 106.05\n",
      "  period 06 : 105.61\n",
      "  period 07 : 104.59\n",
      "  period 08 : 104.04\n",
      "  period 09 : 103.57\n",
      "Model training finished.\n",
      "Final RMSE (on training data):   103.57\n",
      "Final RMSE (on validation data): 102.80\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#\n",
    "# YOUR CODE HERE: Train the network using only latitude and longitude\n",
    "#\n",
    "def latitude_longtitude_process(examples_dataframe):\n",
    "  \"\"\"Returns a version of the input `DataFrame` that has all its features normalized.\"\"\"\n",
    "  processed_features = pd.DataFrame()\n",
    "  processed_features[\"latitude\"] = linear_scale(examples_dataframe[\"latitude\"])\n",
    "  processed_features[\"longitude\"] = linear_scale(examples_dataframe[\"longitude\"])\n",
    "  \n",
    "  return processed_features\n",
    "\n",
    "normalized_dataframe = latitude_longtitude_process(preprocess_features(california_housing_dataframe))\n",
    "normalized_training_examples = normalized_dataframe.head(12000)\n",
    "normalized_validation_examples = normalized_dataframe.tail(5000)\n",
    "\n",
    "_ = train_nn_regression_model(\n",
    "    my_optimizer = tf.train.AdagradOptimizer(learning_rate = 0.05),\n",
    "    steps = 500,\n",
    "    batch_size = 50,\n",
    "    hidden_units = [10,10,10],\n",
    "    training_examples = normalized_training_examples,\n",
    "    training_targets = training_targets,\n",
    "    validation_examples = normalized_validation_examples,\n",
    "    validation_targets = validation_targets)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
